﻿using System;
using System.Windows;
using System.Windows.Controls;
using jSLApp.Client.ApplicationBase;
using jSLApp.Client.MainService;
using jSLCore.Client.Presentation.BaseControl;
using jSLCore.Client.Presentation.BaseControl.DialogMessage;
using jSLCore.Utility.Extensions;

namespace jSLApp.Client.Forms
{
    /// <summary>
    /// Form for administrators
    /// </summary>
    public partial class UserDetail : DialogControl
    {
        private readonly string _login;

        /// <summary>
        /// for designers
        /// </summary>
        public UserDetail()
        {
            InitializeComponent();
        }

        public UserDetail(string login)
        {
            _login = login;
            InitializeComponent();
        }

        public override bool IsOkVisible
        {
            get { return false; }
        }

        public override bool IsStandartOkCancelEnabled
        {
            get { return true; }
        }

        public override object CancelContent
        {
            get { return "Закрыть"; }
        }

        public override bool AutoSize
        {
            get { return true; }
        }

        public override void LoadInitialData()
        {
            DoWork("Загрузка данных пользователя",(sender, args) =>
                                                      {
                                                          args.Result = Communication.Proxy.GetUser(args.String);
                                                      },(o, eventArgs) =>
                                                                            {
                                                                              if(eventArgs.Error==null)  
                                                                                  SetDataContext((User) eventArgs.Result);
                                                                            },_login);
        }


        private void SetDataContext(User user)
        {
            User = user;
            Bind();
        }

        public User User
        {
            get { return (User) DataContext; }
            set { DataContext = value; }
        }

        private void changeRole_Clicked(object sender, RoutedEventArgs e)
        {
            var dlg = new ChangeRole();
            dlg.ShowDialog(delegate(object o, object data)
                               {
                                   DoWork("Смена роли пользователя",(sender1, args) =>
                                                                        {
                                                                            Communication.Proxy.RoleChange(args.String,(Guid) args.Params[1]);
                                                                        },(o1, eventArgs) =>
                                                                                               {
                                                                                                   if(eventArgs.Error==null)
                                                                                                   {
                                                                                                       InfoBox.
                                                                                                           ShowDialog(
                                                                                                               "Роль сменена");
                                                                                                       LoadInitialData();
                                                                                                   }
                                                                                               },User.Login,data);
                               },this );
        }



        private void locker_Clicked(object sender, RoutedEventArgs e)
        {
            var checkBox = sender as CheckBox;
            DoWork("Смена блокировки",(o, args) =>
                                          {
                                              Communication.Proxy.SetIsEnabled(args.String,(bool) args.Params[1]);
                                          },(sender1, eventArgs) =>
                                                           {
                                                               if(eventArgs.Error==null)
                                                               {
                                                                   InfoBox.ShowDialog("Готово");
                                                                   LoadInitialData();   
                                                               }
                                                               else
                                                               {
                                                                   checkBox.IsChecked = !checkBox.IsChecked;
                                                               }
                                                           },User.Login,!checkBox.IsChecked);
        }



        private void delete_Clicked(object sender, RoutedEventArgs e)
        {
            var dlg = new QuestionBox("Пользователь будет удален безвозвратно. Все его файлы так же будут удалены. Продолжить?", QuestionBoxType.OkCancel);
            dlg.ShowDialog(delegate(object o, object data)
            {
                DoWork("Удаление пользователя", (sender1, args) =>
                {
                    Communication.Proxy.DeleteUser(args.String);
                }, (o1, eventArgs) =>
                {
                    if (eventArgs.Error == null)
                    {
                        InfoBox.ShowDialog("Пользователь удален");
                        InvokeCancelSelected();
                    }
                }, User.Login);
            }, this);
        }

        private void acceptMail_Clicked(object sender, RoutedEventArgs e)
        {
            DoWork("Подтверждение адреса электронной почты",(o, args) =>
                                                                {
                                                                    Communication.Proxy.ManualAcceptMail(args.String);
                                                                },(sender1, eventArgs) =>
                                                                                 {
                                                                                     if(eventArgs.Error==null)
                                                                                     {
                                                                                         InfoBox.ShowDialog("E-Mail подтвержден и пользователь разблокирован, пользователь может выполнить вход в систему.");
                                                                                         LoadInitialData();
                                                                                     }
                                                                                 },User.Login);
        }

        private void senMail(object sender, RoutedEventArgs e)
        {
            ((MainContentContainer)ParentContentContainer).SendEMail(User.Login);
        }

        private void goPersonalPage_Clicked(object sender, RoutedEventArgs e)
        {
            var dlg = new PersonalPage(_login);
            dlg.ShowDialog();
        }
    }
}
